home *** CD-ROM | disk | FTP | other *** search
/ Amiga Packmags / NewsFlash - Issue 10 (1990)(UGA - NewsFlash UK)(Disk 1 of 2)[a3].zip / NewsFlash - Issue 10 (1990)(UGA - NewsFlash UK)(Disk 1 of 2)[a3].adf / prog / hyman_Article < prev    next >
Text File  |  1996-12-24  |  7KB  |  343 lines

  1. ; Hi there freaks !
  2. ;
  3. ; In this month's (small) article a really fast Mandelbrot fractals drawer.
  4. ; For people who don't know nothing about fractals: STOP READING.
  5. ; (Sorry but I had no time to write a whole article about Fractals)
  6. ;
  7. ;
  8. ; This little source uses coordinates like Analytic-Art.
  9. ; Just take some coordinates from AA and multiply them by 4096.
  10. ; Put them in the 'equ' of XC & YC (Centre) and XW & YW
  11. ; (Width). The 'Window' can be changed with XS & YS
  12. ;
  13. ; Just load this article in your assembler, assemble and run it ...
  14. ;
  15. ;
  16. ; Note for the insiders :This routine skips a part of the inside of the
  17. ; mandelbrot for speed improvement.
  18. ;
  19. ;
  20. ; I just wanted to share this little routine with you.
  21. ; So you'll have to make your own screen save routine etc.
  22. ;
  23. ; Note how easy it is to 'allocate' memory with BSS hunks !
  24. ; (You already knew that, but I was just checking)
  25. ;
  26. ; Note: This is a DEVPAC 2.14 source !
  27. ; Note2: Propably won't work on other assemblers like SEKA (yek) without
  28. ;        making some changes. (READ: demolishing my source)
  29. ;
  30. ;
  31. ; If you have any questions, lose change, new ideas, etc. then send
  32. ; them to:
  33. ;
  34. ; P. de Boer
  35. ; Zeeloodsenlaan 79
  36. ; 1785 BM  Den Helder
  37. ; Holland
  38. ;
  39. ;--------------------------------------------------------------------------
  40. ;
  41. ; HY MAN   (HYperfast MANdelbrots)
  42. ; written for UGA by P. de Boer
  43. ;
  44. ; Notice that my TAB is set on 16  (Gives Clean and Spacy sources !)
  45. ;--------------------------------------------------------------------------
  46.     opt o+        ;optimize
  47.  
  48. ExecBase    equ    $4
  49. Forbid    equ    -132
  50. Permit    equ    -138
  51. OpenLibrary    equ    -552
  52. CloseLibrary    equ    -414
  53.  
  54. COP1LCH    equ    $080
  55. COPJMP1    equ    $088
  56.  
  57. DIWSTRT    equ    $08E
  58. DIWSTOP    equ    $090
  59. DDFSTRT    equ    $092
  60. DDFSTOP    equ    $094
  61. DMACON    equ    $096
  62.  
  63. BPL1PTH    equ    $0E0
  64. BPL1PTL    equ    $0E2
  65. BPL2PTH    equ    $0E4
  66. BPL2PTL    equ    $0E6
  67. BPL3PTH    equ    $0E8
  68. BPL3PTL    equ    $0EA
  69. BPL4PTH    equ    $0EC
  70. BPL4PTL    equ    $0EE
  71. BPL5PTH    equ    $0F0
  72. BPL5PTL    equ    $0F2
  73. BPLCON0    equ    $100
  74. BPLCON1    equ    $102
  75. BPLCON2    equ    $104
  76. BPL1MOD    equ    $108
  77. BPL2MOD    equ    $10A
  78.  
  79. COLOR00    equ    $180
  80. COLOR02    equ    $184
  81. COLOR04    equ    $188
  82. COLOR06    equ    $18C
  83. COLOR08    equ    $190
  84. COLOR10    equ    $194
  85. COLOR12    equ    $198
  86. COLOR14    equ    $19C
  87. COLOR16    equ    $1A0
  88. COLOR18    equ    $1A4
  89. COLOR20    equ    $1A8
  90. COLOR22    equ    $1AC
  91. COLOR24    equ    $1B0
  92. COLOR26    equ    $1B4
  93. COLOR28    equ    $1B8
  94. COLOR30    equ    $1BC
  95.  
  96. CUSTOM    equ    $DFF000
  97. CIAAPRA    equ    $BFE001
  98. ;--------------------------------------------------------------------------
  99.     SECTION    MainProgram,CODE
  100.  
  101. StartMain    movea.l     (ExecBase).w,a6
  102.     jsr     Forbid(a6)
  103.  
  104. OpenGfxLibrary    lea     GfxName(pc),a1
  105.     clr.l     d0
  106.     jsr     OpenLibrary(a6)
  107.     move.l     d0,GfxBase
  108.     beq     Einde
  109.  
  110. ;--------------------------------------------------------------------------
  111. MakeCopperList    lea    CList,a0
  112.     move.l     #Screen,d0
  113.  
  114.     move.w    #BPL1PTH,(a0)+
  115.     swap    d0
  116.     move.w    d0,(a0)+
  117.     move.w    #BPL1PTL,(a0)+
  118.     swap    d0
  119.     move.w    d0,(a0)+
  120.  
  121.     add.l    #40*256,d0
  122.     move.w    #BPL2PTH,(a0)+
  123.     swap    d0
  124.     move.w    d0,(a0)+
  125.     move.w    #BPL2PTL,(a0)+
  126.     swap    d0
  127.     move.w    d0,(a0)+
  128.  
  129.     add.l    #40*256,d0
  130.     move.w    #BPL3PTH,(a0)+
  131.     swap    d0
  132.     move.w    d0,(a0)+
  133.     move.w    #BPL3PTL,(a0)+
  134.     swap    d0
  135.     move.w    d0,(a0)+
  136.  
  137.     add.l    #40*256,d0
  138.     move.w    #BPL4PTH,(a0)+
  139.     swap    d0
  140.     move.w    d0,(a0)+
  141.     move.w    #BPL4PTL,(a0)+
  142.     swap    d0
  143.     move.w    d0,(a0)+
  144.  
  145.     add.l    #40*256,d0
  146.     move.w    #BPL5PTH,(a0)+
  147.     swap    d0
  148.     move.w    d0,(a0)+
  149.     move.w    #BPL5PTL,(a0)+
  150.     swap    d0
  151.     move.w    d0,(a0)+
  152.  
  153.     move.l    #$fffffffe,(a0)
  154. ;--------------------------------------------------------------------------
  155. InstallCopper    lea    CUSTOM,a6
  156.     move.w     #$07E0,DMACON(a6)
  157.  
  158.     move.l     #CList,COP1LCH(a6)
  159.     clr.w     COPJMP1(a6)
  160.  
  161. ScreenSettings    move.l     #$298129C1,DIWSTRT(a6)    ;move.l
  162.     move.l     #$003800D0,DDFSTRT(a6)    ;is faster
  163.     move.w     #$5000,BPLCON0(a6)    ;than two
  164.     clr.l    BPLCON1(a6)        ;move.w 's
  165.     clr.l    BPL1MOD(a6)    ;clr.l is saver
  166.             ;then moveq #0
  167.  
  168. SetColors    move.l    #$00000005,COLOR00(a6)
  169.     move.l    #$00060007,COLOR02(a6)
  170.     move.l    #$00180029,COLOR04(a6)
  171.     move.l    #$003A004B,COLOR06(a6)
  172.     move.l    #$015C036D,COLOR08(a6)
  173.     move.l    #$058E079F,COLOR10(a6)
  174.     move.l    #$09BF0BCF,COLOR12(a6)
  175.     move.l    #$0DDF0EEF,COLOR14(a6)
  176.     move.l    #$0FFF0EEF,COLOR16(a6)
  177.     move.l    #$0DDF0BBF,COLOR18(a6)
  178.     move.l    #$09AF078F,COLOR20(a6)
  179.     move.l    #$057E036D,COLOR22(a6)
  180.     move.l    #$015C004B,COLOR24(a6)
  181.     move.l    #$003A0029,COLOR26(a6)
  182.     move.l    #$00180007,COLOR28(a6)
  183.     move.l    #$00060005,COLOR30(a6)
  184.  
  185.  
  186. StartDMA    move.w    #$8380,DMACON(a6)
  187.         ;Only BitPlane & Copper DMA
  188. ;--------------------------------------------------------------------------
  189. ItMax    equ    31    ;maximum iteration
  190. XS    equ    320    ;'Window' width
  191. YS    equ    256    ;'Window' height
  192. XW    equ    20480    ;Zoom Wnd Width (x 4096)
  193. YW    equ    XW*4/5    ;Zoom Wnd Height (x 4096)
  194. XC    equ    0    ;Zoom Centre x
  195. YC    equ    0    ;Zoom Centre y
  196. DX    equ    XW/XS    ;Step size X
  197. DY    equ    YW/YS    ;Step size Y
  198. MaxX    equ    XC+XW/2    ;Max value x
  199. MinY    equ    YC-YW/2    ;Min value y
  200.  
  201. Start    movea.w    #MaxX,a0
  202.     movea.w    #MinY,a1
  203.     movea.w    #DX,a2
  204.     movea.w    #DY,a3
  205.     movea.w    a0,a4
  206.     lea    Screen,a5
  207.  
  208.     move.w    #YS-1,d1
  209. ForY    move.w    #XS-1,d0
  210. ForX    move.w    a0,d2    ;x=0
  211.     move.w    a1,d3    ;y=0
  212.     move.w    #ItMax,d7    ;itr=max
  213.  
  214. CheckIt    move.w    d2,d4    ;xq=x*x
  215.     move.w    d3,d5    ;yq=y*y
  216.     muls    d4,d4
  217.     muls    d5,d5
  218.  
  219.     move.l    d5,d6
  220.     add.l    d4,d6    ;xq+yq>>>
  221.     swap    d6
  222.     cmp.w    #$0400,d6
  223.     bgt.s    OutOfRange    ;yes ->Out of Range
  224.  
  225.     tst.w    d2
  226.     bpl.s    JumpIn
  227.  
  228.     cmp.w    #$0060,d6    ;skip part
  229.     bge.s    JumpIn
  230.  
  231.     clr.w    d7    ;replace this if you want to
  232.     bra.s    OutOfRange    ;see what is skipped
  233.  
  234. Iteration    move.w    d2,d4    ;xq=x*x
  235.     move.w    d3,d5    ;yq=y*y
  236.     muls    d4,d4
  237.     muls    d5,d5
  238.  
  239.     move.l    d5,d6
  240.     add.l    d4,d6    ;xq+yq>>>
  241.     swap    d6
  242.     cmp.w    #$0400,d6
  243.     bgt.s    OutOfRange    ;yes ->Out of Range
  244.  
  245. JumpIn    exg    d4,d2
  246.     sub.l    d5,d2    ;x=xq-yq
  247.     asl.l    #4,d2    ;rescale number
  248.     swap    d2
  249.     add.w    a0,d2    ;x=x+xc
  250.     bvs.s    OutOfRange
  251.  
  252.     muls    d4,d3    ;y=z*y
  253.     asl.l    #5,d3    ;rescale number
  254.     swap    d3
  255.     add.w    a1,d3    ;y=y+yc
  256.     dbvs    d7,Iteration
  257.  
  258.     bvc.s    StaysBlack
  259.  
  260. OutOfRange    bsr.s    SetPoint
  261.  
  262. StaysBlack    suba.w    a2,a0
  263.     dbf    d0,ForX
  264.  
  265.     movea.w    a4,a0
  266.     adda.w    a3,a1
  267.  
  268.     btst    #6,CIAAPRA    ;quit if left mouse-button
  269.     beq.s    Recover    ;is pressed
  270.  
  271.     dbf    d1,ForY
  272.  
  273. ;--------------------------------------------------------------------------
  274. Wacht    btst    #6,CIAAPRA
  275.     bne.s    Wacht
  276. ;--------------------------------------------------------------------------
  277. Recover    movea.l    GfxBase(pc),a4
  278.     move.l     38(a4),COP1LCH(a6)
  279.     clr.w     COPJMP1(a6)
  280.     move.w     #$83E0,DMACON(a6)
  281.  
  282. CloseGfx    movea.l     (ExecBase).W,a6
  283.     movea.l     GfxBase(pc),a1
  284.     jsr     CloseLibrary(a6)
  285.  
  286. Einde    jsr     Permit(a6)
  287.     clr.l     d0
  288.      rts
  289. ;--------------------------------------------------------------------------
  290. SetPoint    lea    Screen,a5
  291.     move.w    d0,d2
  292.     move.w    d1,d3
  293.  
  294.     lsl.w    #3,d3
  295.     adda.w    d3,a5
  296.     lsl.w    #2,d3
  297.     adda.w    d3,a5
  298.  
  299.     move.w    d0,d6
  300.     lsr.w    #3,d6
  301.     adda.w    d6,a5
  302.  
  303.     moveq    #$F,d6
  304.     and.w    d6,d2
  305.     eor.w    d6,d2
  306.  
  307. Plane1    btst    #0,d7
  308.     beq.s    Plane2
  309.     bset    d2,(a5)
  310.  
  311. Plane2    adda.w    #40*256,a5
  312.     btst    #1,d7
  313.     beq.s    Plane3
  314.     bset    d2,(a5)
  315.     
  316. Plane3    adda.w    #40*256,a5
  317.     btst    #2,d7
  318.     beq.s    Plane4
  319.     bset    d2,(a5)
  320.  
  321. Plane4    adda.w    #40*256,a5
  322.     btst    #3,d7
  323.     beq.s    Plane5
  324.     bset    d2,(a5)
  325.  
  326. Plane5    adda.w    #40*256,a5
  327.     btst    #4,D7
  328.     beq.s    Out
  329.     bset    d2,(a5)
  330.  
  331. Out    rts
  332. ;--------------------------------------------------------------------------
  333. GfxBase    dc.l     0
  334. GfxName    dc.b     "graphics.library",0    
  335.     even
  336. ;--------------------------------------------------------------------------
  337.     SECTION    Memory,BSS_C
  338.  
  339. CList    ds.w    100    ;This is a fast way to get
  340. Screen    ds.b    256*40*5    ;your memory 'allocated'
  341. ;--------------------------------------------------------------------------
  342.  
  343.